package com.tiankun.eurekauserinfo.controller;

import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.tiankun.eurekauserinfo.utils.JsonResult;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * Created with IntelliJ IDEA
 * User: bear
 * Date: 2020/10/21
 * Description
 * Version: V1.0
 */
@RestController
@RequestMapping("sms")
@CrossOrigin   //用于实现跨域的注解
public class SMSController {

    @Resource
    RedisTemplate<String, Object> redisTemplate;
    JsonResult jsonResult = new JsonResult();

    @RequestMapping("/send")
    public Map send(@RequestParam(value = "phone") String phone) {

        //接收来自阿里云的返回数据
        //根据返回值给用户提示

        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI4G8idm9BfpTost4ZBPMJ", "963NmrkdlQrG8sk4kfoaai8mCpjhtk");
        IAcsClient client = new DefaultAcsClient(profile);

        //阿里短信标准配置
        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("dysmsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        request.setSysAction("SendSms");
        request.putQueryParameter("RegionId", "cn-hangzhou");
        request.putQueryParameter("PhoneNumbers", phone);
        request.putQueryParameter("SignName", "Bear商城");//必须经过审核之后才能发送成功
        request.putQueryParameter("TemplateCode", "SMS_204986113");

        //准备发送内容
        //生成4位随机数验证码(1-9)
        String code = "";
        for (int i = 0; i < 4; i++) {
            code += (int) (Math.random() * 9 + 1);
        }
        // 给阿里云短信模板中的${code}赋值，json格式
        request.putQueryParameter("TemplateParam", "{'code':" + code + "}");
        try {
            //用于响应
            CommonResponse response = client.getCommonResponse(request);
            // 获取的验证码数据,
            String data = response.getData();
            //返回的格式
            //{"Message":"OK","RequestId":"CBC83055-A113-483A-91B2-0E4C56CCC643","BizId":"790710603115763709^0","Code":"OK"}

            //利用就是菜宽松的ObjectMapper从json字符串中获取指定字段
            System.out.println("data:" + data);
            ObjectMapper mapper = new ObjectMapper();
            Map<String, Object> tmpMap = mapper.readValue(data, Map.class);
            if ("OK".equals(tmpMap.get("Code"))) {

                jsonResult.setCode("200");
                jsonResult.setMsg("验证码发送成功");

                // 将数据保存在redis服务器上, 15分钟有效
                //1.利用redisTemplate去绑定要操作的数据类型,生成对应的操作符
                ValueOperations<String, Object> operations = redisTemplate.opsForValue();

                //2.利用操作符对象对该类型数据进行操作
//                    String phone="18782687401";
//                    String captcha="6666";
                // 设置生存时间
                operations.set("sms:" + phone, code, 15, TimeUnit.MINUTES);

            } else {
                jsonResult.setCode("0");
                jsonResult.setMsg("验证码发送失败,请检查手机号或稍后再试");
            }


        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }

        return jsonResult.getValues();
    }

}
